package org.jboss.loom.utils.el; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.NoSuchElementException; import java.util.StringTokenizer; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Ondrej Zizka, ozizka at redhat.com * @deprecated */ public class SimpleEvaluator implements IExprLangEvaluator { private static final Logger log = LoggerFactory.getLogger( SimpleEvaluator.class ); private final Map<String, ? extends Object> properties; public SimpleEvaluator( Map<String, ? extends Object> properties ) { this.properties = properties; } @Override public String evaluateEL( String template ) { StringTokenizer st = new StringTokenizer( template ); String text = st.nextToken( "${" ); StringBuilder sb = new StringBuilder(); // Parse the template: "Hello ${person.name} ${person.surname}, ${person.age}!" do { try { sb.append( text ); if( !st.hasMoreTokens() ) { break; } // "${foo.bar[a]" String expr = st.nextToken( "}" ); // "foo.bar[a].baz" expr = expr.substring( 2 ); // "foo" String var = StringUtils.substringBefore( expr, "." ); Object subject = properties.get( var ); // "bar[a].baz" String propPath = StringUtils.substringAfter( expr, "." ); sb.append( resolveProperty2( subject, propPath ) ); text = st.nextToken( "${" ); text = text.substring( 1 ); } catch( NoSuchElementException ex ) { // Unclosed ${ log.warn( "Unclosed ${ expression, missing } : " + template ); } } while( true ); return sb.toString(); } // Simple private String resolveProperty( Object subject, String propPath ) { if( subject == null ) { return ""; } return subject.toString(); } // BeanUtils private String resolveProperty2( Object subject, String propPath ) { if( subject == null ) { return ""; } if( propPath == null || propPath.isEmpty() ) { return subject.toString(); } try { return "" + PropertyUtils.getProperty( subject, propPath ); } catch( IllegalAccessException | InvocationTargetException | NoSuchMethodException ex ) { log.warn( "Failed resolving '" + propPath + "' on " + subject + ":\n " + ex.getMessage() ); if( log.isTraceEnabled() ) { log.trace( " Stacktrace:\n", ex ); } return ""; } } } // class